Investigación Reproducible con R

Workshop Ciencia Abierta

Eloy Alvarado Narváez

Universidad Técnica Federico Santa María

Francisco Plaza-Vega

Universidad de Santiago de Chile

3 de enero de 2024

Módulo 1: Introducción a la Investigación Reproducible

¿Qué es la Investigación Reproducible?

Investigación Reproducible

Es la práctica de conducir estudios científicos o basados en datos de tal manera que permita a otros replicar o reproducir los resultados usando los mismos datos, códigos y metodologías.

¿Qué se entiende por un estudio Reproducible y Replicable?

Reproducible

Los autores entregan todos los datos necesarios y los códigos computacionales para realizar el análisis nuevamente, recreando los resultados.

Replicable

Un estudio que llega a los mismos hallazgos científicos que otro estudio, recolectando nuevos datos (posiblemente con diferentes métodos) y completando nuevos análisis.

Clases de Reproducibilidad

  • Reproducibilidad Computacional: Cuando se proporciona información detallada sobre el código, software, hardware y detalles de la implementación

  • Reproducibilidad Empírica: Cuando se proporciona información detallada sobre experimentos y observaciones científicas empíricas no computacionales. En la práctica, esto se ocurre al hacer que los datos y los detalles de cómo se recopilaron estén disponibles de forma gratuita.

  • Reproducibilidad Estadística: Cuando se proporciona información detallada, por ejemplo, sobre la elección de pruebas estadísticas, parámetros del modelo y valores de umbral. Esto se relaciona principalmente con el registro previo del diseño del estudio para evitar la práctica de p-value hacking y otras manipulaciones.

Reproducibilidad

Reproducibilidad

Ventajas y dificultades

Ventajas Dificultades
Historial completo del proyecto Incentivos limitados
Colaboración y Revisión Sesgo de las investigaciones hacia hallazgos novedosos
Evita la desinformación Mayores estándares
Escritura eficiente Se aplican mayores estándares a las investigaciones reproducibles
Reconocimiento justo No es considerado para las promociones
Asegura la continuidad del trabajo Variabilidad en el rendimiento de los software utilizados
Que una investigación sea reproducible no significa que esté correcta
Toma más tiempo

Etapas de una Investigación Reproducible

Ciencia Abierta

“1.500 scientist lift the lid on reproducibility”

Difusión y citas

Datos Abiertos

Solo una proporción muy pequeña de los datos originales se publica en revistas convencionales o investigaciones públicas. A pesar de las políticas existentes sobre el archivo de datos, en la actualidad, los datos se almacenan principalmente en archivos privados, no en repositorios institucionales seguros, y se pierde a ellos por parte del público general.

Esta falta de intercambio de datos es un obstáculo para la investigación internacional (ya sea académica, gubernamental o comercial) por dos razones principales:

  • Generalmente es difícil o imposible reproducir un estudio sin los datos originales.

  • Los datos no pueden ser reutilizados o incorporados en nuevos trabajos por otros investigadores si no pueden acceder a ellos.

Barreras para el intercambio de datos

Software de Código abierto

Cuando un proyecto es de código abierto, cualquiera puede ver, usar, modificar y distribuir el proyecto para cualquier propósito. Estos permisos se aplican a través de una licencia de código abierto

¿Cómo los software de código abierto benefician la investigación?

  • Re-usable

  • Comprobable

  • Colaborativo

Espectro de Reproducibilidad

Sofware necesarios

R project

https://cran.dcc.uchile.cl/

RSudio IDE

https://posit.co/download/rstudio-desktop/

Existen otras alternativas más génericas como Visual Studio Code, un editor de código para múltiples lenguajes. Sin embargo, al no ser un software especializado en R, requiere utilizar extensiones para lograr las funcionalidad que otorga RStudio.

Quarto

https://quarto.org/docs/get-started/

Git & Github

Módulo 2: Control de versiones

Conectar RStudio y Github

  1. Crear una cuenta en GitHub
  2. Crear un token de acceso personal (PAT) en GitHub
library(usethis)
create_github_token()
  1. Almacenar credenciales
library(gitcreds)
gitcreds::gitcreds_set()

RStudio

  1. Tener un proyecto local
  2. Realizar un commit inicial
  3. Escribir:
library(usethis)
usethis::use_github()

Esto creará un repositorio con el nombre del proyecto

  1. Utilizando la interface en RStudio, podremos mantener el control de versiones.

Control de versiones para datos

Importancia del control de versiones para datos

  • Los datos utilizados en los análisis no son estáticos

  • Los datos pueden mutar no sólo debido a que se ingresa nueva información

  • En muchas investigaciones se desea experimentar con diferentes versiones del mismo conjunto de datos

  • Controlar las versiones de conjuntos de datos o de archivos grandes ayuda a la reproducibilidad de un proyecto

Desafíos en el control de versiones para datos

La principal limitación que tiene Git es que conforme la cantidad y tamaño de los archivos en el proyecto crecen, se vuelve impracticable el control de versiones.

  • Usualmente un repositorio se considera grande cuando su tamaño es sobre 1 TB

Herramientas en el control de versiones para datos

Entre las herramientas más usadas para el control de versiones para grandes archivos están:

  • Data Version Control: Particularmente útil cuando se trabaja con muchos modelos, pues puede registrar el desempeño de modelos pre-establecidos commit tras commit.

Administración de datos de investigación

El estándar para investigaciones reproducibles es que los datos cumplan con los principios FAIR

FAIR

“The FAIR Guiding Principles for scientific data management and stewardship”

Módulo 3: Ambientes reproducibles

Ambientes reproducibles

Cada computador es un ambiente computacional único que consiste de un sistema operativo, los softwares instalados, sus respectivas versiones entre otras características.

Supongamos que un proyecto de investigación se lleva a cabo en un computador pero luego se transfiere a un computador diferente. No habrá una garantía que el análisis podrá ser realizado o que generará los mismos resultados si estos dependen de algunas de las características mencionadas.

Para que una investigación sea reproducible, el ambiente computacional en el que se conduce debe poder ser replicado.

¿Qué es un ambiente computacional?

En términos generales, un ambiente computacional es un sistema donde un programa se ejecuta. Esto incluye las características de hardware y software

Replicar los ambientes computacionales tendrá un potencial impacto en:

  • Investigadores

  • Colaboradores

Capturando el ambiente computacional

Categorías:

Sistema de admininistración de paquetes

Los sistemas de administración de paquetes son herramientas usadas para instalar y mantener un seguimiento del software usado en un sistema. Los archivos utilizados pueden ser compartidos con otros para que repliquen el ambiente computacional.

Ejemplos:

Binder

Binder es un servicio que genera versiones funcionales de proyecto desde un repositorio git y los sube a la nube. Estos proyectos “binderizados” son accesibles desde un navegador de internet.

Binder requiere que el software (y óptimamente, sus versiones) necesario para ejecutar un proyecto sea especificado.

Máquinas virtuales

Las máquinas virtuales son computadores simulados. Un usuario puede crear un computador “virtual” fácilmente, especificando el sistema operativo que quieren tener, entre otras características, y ejecutarlo como cualquier otra aplicación.

Contenedores

Los contenedores proveen muchos de los beneficios de una máquina virtual, pues esencialmente actúan como máquinas independientes que contienen sus propios archivos, softwares y configuraciones.

La diferencia radica en que una máquina virtual incluye un sistema operativo junto con sus softwares, independientemente si el proyecto los utiliza. En cambio, los contenedores sólo incluyen el software y archivos explícitamente definidos para ejecutar un proyecto particular.

Ejemplos: Renv

  1. Creamos un nuevo proyecto
  2. Seleccionamos la opción de utilizar renv en el nuevo proyecto
  3. Alternativamente podemos utilizar el comando renv::init() para proyectos existentes
  4. Trabajamos en el código, instalando o sacando paquetes conforme sea necesario
  5. Usamos el comando renv::snapshot() para capturar el ambiente
  • El comando renv::init() tendremos opciones para restaurar, descartar o activar el ambiente computacional
  • El comando renv::dependencies() nos entrega los paquetes de los cuales depende nuestro proyecto.

Ejemplos: Conda

  1. Instalar Anaconda
  2. Seleccionar pestaña Environment
  3. Crear ambiente de proyecto (R, Python o ambos)
  4. Utilizar RStudio desde anaconda.

Ejemplos: BinderHub

Pasos para crear un ambiente en BinderHub

  1. Entrar a Binder
  2. Crear un repositorio usando el siguiente template: binder-r
  3. Subir archivos al repositorio.
  4. Modificar archivo install.R con los paquetes necesarios
  5. Modificar runtime.txt con la versión de R necesaria
  • Para ver la versión de R con la que se está trabajando: version en la consola de
  1. Modificar README.md con la dirección del repositorio, por ejemplo:

http://mybinder.org/v2/gh/binder-examples/r/master?urlpath=rstudio

cambia a

http://mybinder.org/v2/gh/ealvnrz/binder-r-test/master?urlpath=rstudio

YAML

YAML es un formato de serialización de datos que puede ser leído fácilmente. Su uso es amplio, desde Acciones en GitHub hasta Quarto

Un ejemplo de YAML que difine un ambiente computacional podría ser:

# Define the operating system as Linux
os: linux

# Use the xenial distribution of Linux
dist: xenial

# Use the programming language Python
language: python

# Use version of Python 3.2
python: 3.2

YAML nos será de particular interés para la creación de documentos y presentaciones reproducibles, utilizando quarto.

Caso práctico

Generaremos un proyecto desde cero que tenga las siguientes características:

  • Repositorio en Github
  • Código de R + Administrador de paquetes

Módulo 4: Herramientas básicas

R & RStudio

La discusión eterna

Ambos lenguajes nos permiten realizar investigaciones reproducibles.

R + Python

R y Python no son mutuamente excluyentes

Código python en R

El paquete reticulate nos permite ejecutar código Python en nuestros archivos R.

  1. Instalamos y cargamos el paquete
install.packages("reticulate")
  1. Configuramos la dirección de nuestro python local
library(reticulate)
use_python("/home/ealvnrz/anaconda3/bin/python")
  1. Ejecutamos código python
py_run_string("def Psq (x):
                value= x*x
                return(value)")
  1. Utilizamos la función en R
py$Psq(3)

También es posible ejecutar código R en Python utilizando la libraría rpy2

Programando en R

En lo que resta del curso, asumiremos que se tiene un nivel básico de R; esto es, conocer los operadores básicos de R: funciones, operaciones matemáticas y objectos (vectores, escalares, etc.)

Para una introducción a R, ver Introducción a R del R Development Core Team

Tipos de Datos

Cada objeto en R es de un tipo base y sólo R-core puede crear nuevos tipos

Tipos de datos base

Existen 5 tipos de datos base: double, integer, complex, logical y character. Estos también pueden ser tipo NULL.

Sin importar la complejidad del análisis, en R todos los datos son interpretado como alguno de estos tipos base

typeof(3.14)
[1] "double"
typeof(1L)
[1] "integer"
typeof(3i)
[1] "complex"
typeof(TRUE)
[1] "logical"
typeof('ifop')
[1] "character"
typeof(NULL)
[1] "NULL"

Estructuras de Datos

Matrices (arreglos)

Una característica distintiva de las matrices es que todos los valores son del mismo tipo de dato

Vectores y coerción de tipos

Los vectores son matrices 1-dimensionales.

vector <- vector(length = 3)
vector
[1] FALSE FALSE FALSE
typeof(vector)
[1] "logical"
vector_char <- vector(mode = "character", length = 3)
vector_char
[1] "" "" ""
typeof(vector_char)
[1] "character"

Coerción

¿Qué producirá el siguiente código?:

ex <- c(2,6,"3")

Respuesta:

[1] "2" "6" "3"

En lo anterior, se realizó una coerción de tipo. No tener claridad de cómo funciona esto, es lo que usualmente dificulta programar correctamente un código en R.

La coerción ocurre cuando ingresamos datos de distinto tipo en un objeto que sólo permite que sus valores sean de un sólo tipo

Reglas de coerción:

logical -> integer -> numeric -> complex -> character

Leemos -> como “puede ser transformado en”

Ejemplos de coerción

logical -> character

c("a", TRUE)
[1] "a"    "TRUE"
c("FALSE", TRUE)
[1] "FALSE" "TRUE" 

logical -> numeric

c(0, TRUE)
[1] 0 1

Es posible forzar una coerción utilizando as.

chars <- c("0","3","4")
as.numeric(chars)
[1] 0 3 4
as.logical(chars)
[1] NA NA NA
as.logical(as.numeric(chars))
[1] FALSE  TRUE  TRUE
as.numeric(c("FALSE", TRUE))
[1] NA NA

Listas

Las listas puede guardar objetos de cualquier tipo o clase

list(1, "a", TRUE)
[[1]]
[1] 1

[[2]]
[1] "a"

[[3]]
[1] TRUE

Objectos S3, S4 Y S6

Las matrices y listas tienen un tipo base inmutable. En contraste, en R existen los objetos S3, S4 y S6; siendo S3 el más común.

Estos objetos tienen un atributo de clase, que permite que existan funcionalidad especificas para aquella clase. Esto es una característica principal de la programación orientada a objetos

Data.frames

El objeto S3 más importante en R es el data.frame, que son un tipo especial de lista

df <- data.frame(id = 1:3, 
                 tratamiento = c("a", "b", "b"), 
                 estado = c(TRUE, TRUE, FALSE))
df
  id tratamiento estado
1  1           a   TRUE
2  2           b   TRUE
3  3           b  FALSE

Data.frames

typeof(df)
[1] "list"
class(df)
[1] "data.frame"
sloop::otype(df)
[1] "S3"

Tidyverse es un sistema coherente de paquetes para manipulación, exploración y visualización de datos que comparten una filosofía de diseño común.













Ventajas:

  • Funciones consistentes
  • Cobertura de flujo de trabajo
  • Enfoque parsimonioso para el desarrollo de herramientas

Flujo de trabajo